/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package rna;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/**
 *
 * @author igo
 */

/**
 * @Descrição
 * Essa classe tem como atributo: numero de camadas que irá compor a rede e o
 * array de camadas, o qual cada posição representará uma determinada camada,
 * seguindo a ordem de criação das mesmas.
 *
 * Ao instanciar a rede é necessário informar o numero de camadas.
 *
 * Para criar efetivamente a rede, é necessário chamar o método criarRede, que irá
 * chamar o metodo criarArrayCamadas, depois o feedfoward.
 * O feedfoward é responsável por setar as entras e calcular as saídas das camadas.
 *
 */
public class Rede {
    
    int numeroDeCamadas;
    ArrayList<Camadas> arrayCamadas = new ArrayList<Camadas>();

    public Rede(int qntCamadas){
        numeroDeCamadas = qntCamadas;
    }

    public void setArrayCamadas(ArrayList<Camadas> arrayCamadas) {
        this.arrayCamadas = arrayCamadas;
    }
//antigo
//    public void criarRede(ArrayList<Double> primeirasEntradas) throws IOException{
//        //Primeiro passo, criar as camadas juntamente com os neuronios de cada:
//        criarArrayCamadas();
//        feedfoward(primeirasEntradas);
//    }

    public ArrayList<Camadas> criarRede() throws IOException{
    //Primeiro passo, criar as camadas juntamente com os neuronios de cada:
    criarArrayCamadas();
    return arrayCamadas;

    }


    public void criarArrayCamadas() throws IOException{
        int numeroDeNeuronios;

        for(int i=0;i<numeroDeCamadas;i++){
            System.out.println("Digite a quantidade de neuronios para a camada: " + i + " ?");
            numeroDeNeuronios = lerQntDeNeuronio();
//            System.out.println("Quandidade de neuronios: " + numeroDeNeuronios );
            Camadas camadaCriada = new Camadas(numeroDeNeuronios);
            camadaCriada.criarNeuronios();
            arrayCamadas.add(camadaCriada);
        }
    }

    public int lerQntDeNeuronio() throws IOException{
        BufferedReader in = new  BufferedReader(new InputStreamReader(System.in));
        String dadoLido = in.readLine();
        int quantidadeNeuronio = Integer.parseInt(dadoLido);
        return quantidadeNeuronio;
    }

    public double getSaidaUltimaCamada(){
        return arrayCamadas.get(numeroDeCamadas-1).saidas[0];
    }

/*    public void feedfoward(ArrayList<Double> dadosCamadaDeEntrada){
        // Add um flag para distinguir a primeira rodada do feed das demais: problema com os pesos iniciais.
        //acessa a primeira camada, camada de entrada, e define suas entradas
//        arrayCamadas.get(0).setEntradas(dadosCamadaDeEntrada);
//        arrayCamadas.get(0).neuronios.get(0).setPesosInicial();
//        arrayCamadas.get(0).neuronios.get(1).setPesosInicial();


        for(int i = 0;i<arrayCamadas.size();i++){
            if(i==0){ // a primeira camada, camada de entrada
                arrayCamadas.get(i).setEntradas(dadosCamadaDeEntrada);

                //Atribuir os pesos a todos os neuronio de determinada camada
                for(int j=0;j<arrayCamadas.get(i).neuronios.size();j++){
                    arrayCamadas.get(i).neuronios.get(j).setPesosInicial();
                }

            }
            else{
                //Define as saidas e entradas das próximas camadas
                arrayCamadas.get(i).setEntradas(arrayCamadas.get(i-1).getSaidas());
                
                //Atribuir os pesos a todos os neuronio de determinada camada
                for(int j=0;j<arrayCamadas.get(i).neuronios.size();j++){
                    arrayCamadas.get(i).neuronios.get(j).setPesosInicial();
                }
            }  
        }
        //System.out.println("pesos de um?: " + arrayCamadas.get(1).neuronios.get(0).pesos);
        //System.out.println("pesos de dois?: " + arrayCamadas.get(1).neuronios.get(1).pesos);

        ArrayList<Double> saida = new ArrayList<Double>();
        saida = arrayCamadas.get(2).getSaidas();
//        System.out.println("Saida da umatima camada: " + saida);
        imprimirResultados();
    }

    public void imprimirResultados(){

        for(int i=0; i< arrayCamadas.size();i++){
            System.out.println("------------------------------------------------");
            System.out.println("Entrada da Camada: " + i +" é: " + arrayCamadas.get(i).entrada);
            System.out.println("Saida da Camada: " + i +" é: " + arrayCamadas.get(i).saidas);
        }

    }*/

}